// 在根目录创建一个plugins编写vite插件帮我们启动electron
// 打包electron项目

import type { Plugin } from 'vite'
import * as electronBuilder from 'electron-builder'
import path from 'path'
import fs from 'fs'
import { buildSync } from 'esbuild'

// 导出vite插件函数
// 打包：需要先等vite打完包之后才有index.html; 然后自动触发调用vite钩子函数，然后再在这个钩子里面执行electron-bulider打包，打包electron
export const viteElectronBuild = (): Plugin => {
  return {
    // 插件名称
    name: 'vite-electron-build',
    // 配置vite插件钩子
    // closeBundle是vite的一个插件钩子函数，用于在vite构建完成后执行一些自定义逻辑。
    closeBundle() {
      // 定义初始化Electron应用程序的函数
      // 为什么还需要这个函数？
      // 有一个场景，接手的人直接执行npm run build，而没有执行npm run dev，就会报错:找不到background.js文件。因为没有编译成js文件，所以找不到background.js文件
      // 同时也是保持代码一致性
      const initElectronApp = () => {
        buildSync({
          entryPoints: ['src/background.ts'],
          bundle: true,
          outfile: 'dist/background.js',
          platform: 'node',
          target: 'node12',
          external: ['electron'],
          format: 'esm',
        })
      }

      // 调用初始化Electron应用程序函数
      initElectronApp()
      // electron-builder需要指定package.json 的main属性，main属性指向dist/background.js
      // 修改package.json文件的main字段，将main字段指向dist/background.js文件。不然会打包失败
      const json = JSON.parse(fs.readFileSync('package.json', 'utf-8'))
      json.main = 'background.js'
      fs.writeFileSync(fs.openSync('dist/package.json', 'w'), JSON.stringify(json, null, 2))
      // bug  electron-builder 他会给你下载垃圾文件
      // 解决上面的bug:创建一个空的（假的）node_modules文件夹，不然会打包失败
      fs.mkdirSync(path.join(process.cwd(), 'dist/node_modules'))

      // 使用electron-builder打包Electron应用程序
      electronBuilder.build({
        config: {
          appId: 'com.example.app', // 应用程序的唯一标识符，上线要写成真实的appId
          productName: 'vite-electron', // 应用程序的名称（包名）
          directories: {
            output: path.join(process.cwd(), 'release'), // 输出目录
            app: path.join(process.cwd(), 'dist'), // app目录指向dist，根据dist进行打包
          },
          files: ['**/*'], // 可以不设置，没什么用
          asar: true, // 是否使用asar打包，帮助打包成压缩包提升效率
          nsis: {
            oneClick: false, // 取消一键安装。默认是一键安装（双击一下就安装完成）
            allowToChangeInstallationDirectory: true, // 允许用户选择安装目录。默认是装到C盘
          },
          // mac: {
          //   icon: path.join(process.cwd(), 'src/assets/icon.icns'), // macOS 图标文件路径
          // },
          // win: {
          //   icon: path.join(process.cwd(), 'src/assets/icon.ico'), // Windows 图标文件路径
          // },
        },
      })
    },
  }
}

// closeBundle 我们electron打包是需要index.html 所以我们先等vite打完包之后vite会自动调用这个钩子 然后在这个钩子里面打包electron
